<!doctype html>
<html lang="zh-CN">
<head>
	<meta charset="utf-8">
	<title>Laravel - 为 WEB 艺术家创造的 PHP 框架。 | Laravel 中文网</title>
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<meta name="author" content="Laravel 中文网">
	<meta name="description" content="Laravel - 为 WEB 艺术家创造的 PHP 框架。| Laravel 中文网">
	<meta name="keywords" content="Laravel中文社区,php框架,laravel中文网,php framework,restful routing,laravel,laravel php">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<!--[if lte IE 9]>
		<script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
	<![endif]-->
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="stylesheet" href="../../assets/css/laravel.css">
</head>
<body class="docs language-php">

	<span class="overlay"></span>

	<nav class="main">
		<div class="container">
			<a href="../../index.html" class="brand">
				<img src="../../assets/img/laravel-logo.png" height="30">
				Laravel
			</a>

			<div class="responsive-sidebar-nav">
				<a href="#" class="toggle-slide menu-link btn">&#9776;</a>
			</div>

				<div class="switcher">
					<div class="dropdown">
						<button class="btn dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
							<!--<span class="faint">v</span> -->
							4.2
							<span class="caret"></span>
						</button>
						<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="../5.0/index.html">5.0</a>
								</li>
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="index.html">4.2</a>
								</li>
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="../4.1/index.html">4.1</a>
								</li>
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="../4.0/index.html">4.0</a>
								</li>
						</ul>
					</div>
				</div>

			<ul class="main-nav">
				<li class="nav-docs"><a href="../index.html">中文文档</a></li>
				<li class="nav-community"><a href="http://wenda.golaravel.com" target="_blank">问答社区</a></li>
				<li class="nav-api"><a href="http://laravel.com/api/5.0/" target="_blank">API</a></li>
				<li class="nav-laracasts"><a href="https://laracasts.com" target="_blank">视频教程（国外）</a></li>
				<li class="nav-forge"><a href="https://forge.laravel.com" target="_blank">Forge</a></li>
				
			</ul>
		</div>
	</nav>

		<nav id="slide-menu" class="slide-menu" role="navigation">
		
		<div class="brand">
			<a href="../../index.html">
				<img src="../../assets/img/laravel-logo-white.png" height="50">
			</a>
		</div>

		<ul class="slide-main-nav">
			<li><a href="../../index.html">首页</a></li>
			<li class="nav-docs"><a href="../index.html">中文文档</a></li>
			<li class="nav-community"><a href="http://wenda.golaravel.com" target="_blank">问答社区</a></li>
			<li class="nav-api"><a href="http://laravel.com/api/5.0/" target="_blank">API</a></li>
			<li class="nav-laracasts"><a href="https://laracasts.com" target="_blank">视频教程（国外）</a></li>
			<li class="nav-forge"><a href="https://forge.laravel.com" target="_blank">Forge</a></li>
			
		</ul>

		<div class="slide-docs-nav">
			<h2>文档目录</h2>
			<ul>
<li>序言
<ul>
<li><a href="introduction.html">简介</a></li>
<li><a href="quick.html">快速入门</a></li>
<li><a href="releases.html">版本说明</a></li>
<li><a href="upgrade.html">升级指南</a></li>
<li><a href="contributions.html">贡献指南</a></li>
</ul>
</li>
<li>开始学习
<ul>
<li><a href="installation.html">安装</a></li>
<li><a href="configuration.html">配置</a></li>
<li><a href="homestead.html">Homestead 开发环境部署工具</a></li>
<li><a href="lifecycle.html">请求的生命周期</a></li>
<li><a href="routing.html">路由</a></li>
<li><a href="requests.html">请求与输入</a></li>
<li><a href="responses.html">视图与响应</a></li>
<li><a href="controllers.html">控制器</a></li>
<li><a href="errors.html">错误与日志</a></li>
</ul>
</li>
<li>深度历险
<ul>
<li><a href="security.html">身份验证</a></li>
<li><a href="billing.html">计费</a></li>
<li><a href="cache.html">缓存</a></li>
<li><a href="extending.html">核心扩展</a></li>
<li><a href="events.html">事件</a></li>
<li><a href="facades.html">Facades</a></li>
<li><a href="html.html">表单与 HTML</a></li>
<li><a href="helpers.html">有用的工具函数</a></li>
<li><a href="ioc.html">IoC 容器</a></li>
<li><a href="localization.html">本地化</a></li>
<li><a href="mail.html">Mail</a></li>
<li><a href="packages.html">扩展包开发</a></li>
<li><a href="pagination.html">分页</a></li>
<li><a href="queues.html">队列</a></li>
<li><a href="security.html">安全</a></li>
<li><a href="session.html">Session</a></li>
<li><a href="ssh.html">SSH</a></li>
<li><a href="templates.html">模板</a></li>
<li><a href="testing.html">单元测试</a></li>
<li><a href="validation.html">校验</a></li>
</ul>
</li>
<li>数据库
<ul>
<li><a href="database.html">基本用法</a></li>
<li><a href="queries.html">查询构造器</a></li>
<li><a href="eloquent.html">Eloquent ORM</a></li>
<li><a href="schema.html">结构生成器</a></li>
<li><a href="migrations.html">迁移与数据填充</a></li>
<li><a href="redis.html">Redis</a></li>
</ul>
</li>
<li>Artisan 命令行工具
<ul>
<li><a href="artisan.html">概览</a></li>
<li><a href="commands.html">Artisan 扩展开发</a></li>
</ul>
</li>
<li><a href="contributors.html">中文文档贡献者名单</a></li>
</ul>

		</div>

	</nav>

	<div class="docs-wrapper container">

		<section class="sidebar">
			<ul>
<li>序言
<ul>
<li><a href="introduction.html">简介</a></li>
<li><a href="quick.html">快速入门</a></li>
<li><a href="releases.html">版本说明</a></li>
<li><a href="upgrade.html">升级指南</a></li>
<li><a href="contributions.html">贡献指南</a></li>
</ul>
</li>
<li>开始学习
<ul>
<li><a href="installation.html">安装</a></li>
<li><a href="configuration.html">配置</a></li>
<li><a href="homestead.html">Homestead 开发环境部署工具</a></li>
<li><a href="lifecycle.html">请求的生命周期</a></li>
<li><a href="routing.html">路由</a></li>
<li><a href="requests.html">请求与输入</a></li>
<li><a href="responses.html">视图与响应</a></li>
<li><a href="controllers.html">控制器</a></li>
<li><a href="errors.html">错误与日志</a></li>
</ul>
</li>
<li>深度历险
<ul>
<li><a href="security.html">身份验证</a></li>
<li><a href="billing.html">计费</a></li>
<li><a href="cache.html">缓存</a></li>
<li><a href="extending.html">核心扩展</a></li>
<li><a href="events.html">事件</a></li>
<li><a href="facades.html">Facades</a></li>
<li><a href="html.html">表单与 HTML</a></li>
<li><a href="helpers.html">有用的工具函数</a></li>
<li><a href="ioc.html">IoC 容器</a></li>
<li><a href="localization.html">本地化</a></li>
<li><a href="mail.html">Mail</a></li>
<li><a href="packages.html">扩展包开发</a></li>
<li><a href="pagination.html">分页</a></li>
<li><a href="queues.html">队列</a></li>
<li><a href="security.html">安全</a></li>
<li><a href="session.html">Session</a></li>
<li><a href="ssh.html">SSH</a></li>
<li><a href="templates.html">模板</a></li>
<li><a href="testing.html">单元测试</a></li>
<li><a href="validation.html">校验</a></li>
</ul>
</li>
<li>数据库
<ul>
<li><a href="database.html">基本用法</a></li>
<li><a href="queries.html">查询构造器</a></li>
<li><a href="eloquent.html">Eloquent ORM</a></li>
<li><a href="schema.html">结构生成器</a></li>
<li><a href="migrations.html">迁移与数据填充</a></li>
<li><a href="redis.html">Redis</a></li>
</ul>
</li>
<li>Artisan 命令行工具
<ul>
<li><a href="artisan.html">概览</a></li>
<li><a href="commands.html">Artisan 扩展开发</a></li>
</ul>
</li>
<li><a href="contributors.html">中文文档贡献者名单</a></li>
</ul>

		</section>

		<article>
			<h1>远程连接</h1>
<ul>
<li><a href="#configuration">配置文件</a></li>
<li><a href="#basic-usage">基本用法</a></li>
<li><a href="#tasks">任务</a></li>
<li><a href="#sftp-downloads">SFTP 下载</a></li>
<li><a href="#sftp-uploads">SFTP 上传</a></li>
<li><a href="#tailing-remote-logs">编辑远程日志</a></li>
<li><a href="#envoy-task-runner">Envoy 任务执行</a></li>
</ul>
<p><a name="configuration"></a></p>
<h2>配置文件</h2>
<p>Laravel 可以简单的通过 SSH 方式登录到远程服务器并执行相关操作命令，让您可以简单在远程执行的建立 Artisan 任务。<code>SSH</code> facade 提供了此类行为的入口。</p>
<p>相关的配置文件存在 <code>app/config/remote.php</code> 中，此文件包含所有您需要设定的远程连接配置， <code>connections</code> 数组里有以远程服务器名称作为键值的列表。只要在 <code>connections</code> 数组设定好认证，您就准备好可以执行远程任务了。记得 <code>SSH</code> 可以使用密码或 SSH key 进行身份认证。</p>
<blockquote>
<p><strong>提示:</strong> 需要在远程服务器执行很多任务吗？请阅读 <a href="#envoy-task-runner">Envoy 任务执行</a>!</p>
</blockquote>
<p><a name="basic-usage"></a></p>
<h2>基本用法</h2>
<h4>在在默认服务器执行命令</h4>
<p>使用 <code>SSH::run</code> 方法，在默认的远程服务器执行命令：</p>
<pre><code>SSH::run(array(
    'cd /var/www',
    'git pull origin master',
));
</code></pre>
<h4>在特定服务器执行命令</h4>
<p>您也可以使用 <code>into</code> 方法在特定的服务器上执行命令：</p>
<pre><code>SSH::into('staging')-&gt;run(array(
    'cd /var/www',
    'git pull origin master',
));
</code></pre>
<h4>捕捉命令的输出</h4>
<p>您可以经由传入闭合函数到 <code>run</code> 方法，捕捉远程命令的即时输出：</p>
<pre><code>SSH::run($commands, function($line)
{
    echo $line.PHP_EOL;
});
</code></pre>
<h2>任务</h2>
<p><a name="tasks"></a></p>
<p>如果您需要定义一组一起执行的命令，您可以用 <code>define</code> 方法定义一个「任务」：</p>
<pre><code>SSH::into('staging')-&gt;define('deploy', array(
    'cd /var/www',
    'git pull origin master',
    'php artisan migrate',
));
</code></pre>
<p>您可以用 <code>task</code> 方法执行定义过的任务：</p>
<pre><code>SSH::into('staging')-&gt;task('deploy', function($line)
{
    echo $line.PHP_EOL;
});
</code></pre>
<p><a name="sftp-downloads"></a></p>
<h2>SFTP 下载</h2>
<p><code>SSH</code> 类里有简单的方式可以下载文件，使用 <code>get</code> 和 <code>getString</code> 方法：</p>
<pre><code>SSH::into('staging')-&gt;get($remotePath, $localPath);

$contents = SSH::into('staging')-&gt;getString($remotePath);
</code></pre>
<p><a name="sftp-uploads"></a></p>
<h2>SFTP 上传</h2>
<p><code>SSH</code> 类里也有简单的方式可以上传文件或甚至是字串到远程服务器，使用 <code>put</code> 和 <code>putString</code> 方法：</p>
<pre><code>SSH::into('staging')-&gt;put($localFile, $remotePath);

SSH::into('staging')-&gt;putString($remotePath, 'Foo');
</code></pre>
<p><a name="tailing-remote-logs"></a></p>
<h2>编辑远程日志</h2>
<p>Laravel 有一个有用的命令可以让您在任何远程服务器的 <code>laravel.log</code> 尾端附加日志内容。使用 Artisan 的 <code>tail</code> 命令以及指定远程连线的服务器名称：</p>
<pre><code>php artisan tail staging

php artisan tail staging --path=/path/to/log.file
</code></pre>
<p><a name="envoy-task-runner"></a></p>
<h2>Envoy 任务执行</h2>
<ul>
<li><a href="#envoy-installation">安装</a></li>
<li><a href="#envoy-running-tasks">执行任务</a></li>
<li><a href="#envoy-multiple-servers">多服务器</a></li>
<li><a href="#envoy-parallel-execution">平行执行</a></li>
<li><a href="#envoy-task-macros">任务宏</a></li>
<li><a href="#envoy-notifications">提醒通知</a></li>
<li><a href="#envoy-updating-envoy">更新 Envoy</a></li>
</ul>
<p>Laravel Envoy 提供了简洁，轻量的语法能让您对远程服务器执行任务操作。使用 <a href="../templates#blade-templating">Blade</a> 风格的语法，您可以简单的设置部署任务，执行 Artisan 命令。</p>
<blockquote>
<p><strong>提醒:</strong> Envoy 需要 PHP 5.4 或更高的版本，并且只能在 Mac / Linux 发行版本下执行。</p>
</blockquote>
<p><a name="envoy-installation"></a></p>
<h3>安装</h3>
<p>首先，使用 Composer <code>global</code> 命令安装 Envoy ：</p>
<pre><code>composer global require &quot;laravel/envoy=~1.0&quot;
</code></pre>
<p>记得将 <code>~/.composer/vendor/bin</code> 路径加入 PATH，如此在终端机执行 <code>envoy</code> 命令时才找得到。</p>
<p>再来，在项目根目录建立 <code>Envoy.blade.php</code> 文件。这里有个例子可以让您作为示例：</p>
<pre><code>@servers(['web' =&gt; '192.168.1.1'])

@task('foo', ['on' =&gt; 'web'])
    ls -la
@endtask
</code></pre>
<p>如您所见，<code>@servers</code> 数组建立在文件的开头。您可以在定义任务时，在 <code>on</code> 选项里参照这些服务器。在您的 <code>@task</code> 定义里，写入想要在远程服务器执行的 Bash code。</p>
<p><code>init</code> 命令可以简单的建立一个基本的 Envoy 文件：</p>
<pre><code>envoy init user@192.168.1.1
</code></pre>
<p><a name="envoy-running-tasks"></a></p>
<h3>执行任务</h3>
<p>以 envoy 的 <code>run</code> 命令去执行您设定的任务：</p>
<pre><code>envoy run foo
</code></pre>
<p>如有需要，您可以传递命令行参数到 Envoy 文件：</p>
<pre><code>envoy run deploy --branch=master
</code></pre>
<p>您也可以经由您所熟悉的 Blade 语法使用这些参数：</p>
<pre><code>@servers(['web' =&gt; '192.168.1.1'])

@task('deploy', ['on' =&gt; 'web'])
    cd site
    git pull origin {{ $branch }}
    php artisan migrate
@endtask
</code></pre>
<h4>Bootstrapping</h4>
<p>您可以在 Envoy 文件里使用 <code>@setup</code> 语法定义 PHP 变量和执行一般的 PHP 代码：</p>
<pre><code>@setup
    $now = new DateTime();

    $environment = isset($env) ? $env : &quot;testing&quot;;
@endsetup
</code></pre>
<p>您也可以使用 <code>@include</code> 引入 PHP 文件：</p>
<pre><code>@include('vendor/autoload.php');
</code></pre>
<p><a name="envoy-multiple-servers"></a></p>
<h3>多服务器</h3>
<p>您可以简单的在多个服务器执行任务。只要在任务定义里列出服务器名称：</p>
<pre><code>@servers(['web-1' =&gt; '192.168.1.1', 'web-2' =&gt; '192.168.1.2'])

@task('deploy', ['on' =&gt; ['web-1', 'web-2']])
    cd site
    git pull origin {{ $branch }}
    php artisan migrate
@endtask
</code></pre>
<p>默认任务会循序的在每个服务器上执行。意味着任务会在第一个服务器执行完后才会换到下一个。</p>
<p><a name="envoy-parallel-execution"></a></p>
<h3>平行执行</h3>
<p>如果您想在多个服务器上同时执行任务，只要简单的在任务定义里加上 <code>parallel</code> 选项：</p>
<pre><code>@servers(['web-1' =&gt; '192.168.1.1', 'web-2' =&gt; '192.168.1.2'])

@task('deploy', ['on' =&gt; ['web-1', 'web-2'], 'parallel' =&gt; true])
    cd site
    git pull origin {{ $branch }}
    php artisan migrate
@endtask
</code></pre>
<p><a name="envoy-task-macros"></a></p>
<h3>任务宏</h3>
<p>宏让您可以使用一个命令就循序执行一组任务。例如：</p>
<pre><code>@servers(['web' =&gt; '192.168.1.1'])

@macro('deploy')
    foo
    bar
@endmacro

@task('foo')
    echo &quot;HELLO&quot;
@endtask

@task('bar')
    echo &quot;WORLD&quot;
@endtask
</code></pre>
<p>现在 <code>deploy</code> 宏可以经由一个简单的命令执行：</p>
<pre><code>envoy run deploy
</code></pre>
<p><a name="envoy-notifications"></a>
<a name="envoy-hipchat-notifications"></a></p>
<h3>提醒通知</h3>
<h4>HipChat</h4>
<p>您可能想要在执行完任务后，发送通知到团队的 HipChat 聊天室，使用简单的 <code>@hipchat</code> 定义：</p>
<pre><code>@servers(['web' =&gt; '192.168.1.1'])

@task('foo', ['on' =&gt; 'web'])
    ls -la
@endtask

@after
    @hipchat('token', 'room', 'Envoy')
@endafter
</code></pre>
<p>您也可以自定义发送到 hipchat 聊天室的信息，任何在 <code>@setup</code> 里定义，或是经由 <code>@include</code> 引入的变量都可以使用在信息里：</p>
<pre><code>@after
    @hipchat('token', 'room', 'Envoy', &quot;$task ran on [$environment]&quot;)
@endafter
</code></pre>
<p>这是一个令人惊艳的简单方式，让您的团队保持通知在服务器执行的任务。</p>
<h4>Slack</h4>
<p>下面的语法可以发送通知到 <a href="https://slack.com" target="_blank">Slack</a>：</p>
<pre><code>@after
    @slack('team', 'token', 'channel')
@endafter
</code></pre>
<p><a name="envoy-updating-envoy"></a></p>
<h3>更新 Envoy</h3>
<p>简单的执行 <code>self-update</code> 命令即可更新 Envoy：</p>
<pre><code>envoy self-update
</code></pre>
<p>如果您的 Envoy 安装在 <code>/usr/local/bin</code>，您可能需要加上 <code>sudo</code>：</p>
<pre><code>composer global update
</code></pre>

		</article>
	</div>


	<footer class="main">
		<ul>
			<li class="nav-docs"><a href="../index.html">中文文档</a></li>
			<li class="nav-community"><a href="http://wenda.golaravel.com" target="_blank">问答社区</a></li>
			<li class="nav-api"><a href="http://laravel.com/api/5.0/" target="_blank">API</a></li>
			<li class="nav-laracasts"><a href="https://laracasts.com" target="_blank">视频教程（国外）</a></li>
			<li class="nav-forge"><a href="https://forge.laravel.com" target="_blank">Forge</a></li>
			
		</ul>
		<p>Laravel is a trademark of Taylor Otwell. Copyright &copy; Taylor Otwell.</p>
		<p class="less-significant"><a href="http://jackmcdade.com" target="_blank">Design by Jack McDade</a></p>
	</footer>

	<script src="../../assets/js/laravel.js"></script>
	<script src="../../assets/js/viewport-units-buggyfill.js"></script>
	<script>window.viewportUnitsBuggyfill.init();</script>
	<script type="text/javascript">
	var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
	document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fc8d13872a523d9c286aa7affbe0921f1' type='text/javascript'%3E%3C/script%3E"));
	</script>
</body>
</html>
